
/**
 * 把XML字符串转为js对象
 *
 * @param xml String  xml格式的字符串
 * @return Object 一个对象
 * eg.
    var xml = "
	<result>
	  <exception text='just test'>
	    <code>e0001</code>
	    <message>exception test</message>
	  </exception>
	</result> 
    " ;
    结果为：
    var obj = xml2Object(xml) ;
    alert(obj.exception.text) ;//提示为：just test
    alert(obj.exception.message.innerText) ; //提示为：exception test ，注意innerText的用法。



    var xml = "
	<result>
	  <exception text='just test'>
	    <code>e0001</code>
	    <code><![CDATA[e0002]]></code>
	    <message>exception test</message>
	  </exception>
	</result> 
    " ;
    结果为：
    var obj = xml2Object(xml) ;
    alert(obj.exception.code[0].innerText) ;//提示为：e0001，注意，当同一层中出现相同名字的结点，会转为数组
    alert(obj.exception.code[1].innerText) ; //提示为：e0002，注意"<![CDATA[...]]>"。
 */
function xml2Object(xml){
    var xmlDoc = new ActiveXObject("Microsoft.XMLDOM");
    xmlDoc.loadXML(xml);
    var e=xmlDoc.documentElement;
  
    return elem2Object(e) ;
}

/**
 * 对xml 中的每一个元素转为对象，是一个递归算法
 *
 * @param elem xmlElement xml中的元素
 * @return Object 返回转化后的对象
 */
function elem2Object (elem) {
    var obj = null ;
  
    var elems = elem.childNodes ;

    if (elems.length == 0) { // 没有子结点，不用再递归
        obj = elem.text ;
    } else { 
        obj = new Object() ;
        for (var i = 0 ; i < elems.length ; i ++) {
            var index = elems[i].nodeName ;
            if (index.indexOf("#text") > -1 || index.indexOf("#cdata-section") > -1) {
                index = "innerText" ;
            }
            
            if (typeof(obj[index]) == "undefined") { // 不存在同名结点，新增
                obj[index] = elem2Object(elems[i]) ;
            } else { 
                if (typeof(obj[index][0]) == "undefined") { // 存在且非Array对象　
                    var temp = obj[index] ;
                    obj[index] = new Array() ;
                    obj[index].add(temp) ;
                }
                obj[index].add(elem2Object(elems[i])) ;
            }
            
        }
    
        var atts = elem.attributes ;
        for (var i = 0 ; i < atts.length ; i++) {
            obj[atts[i].name] = atts[i].value ;         
        }
    }
    return obj ;
}


    

    // 把表单中的所有元素转为xml(name & value 对应所为节点的属性)
    function form2Xml(formElem,formNameAlias){

        var node = null ;
        var xmlDoc = new ActiveXObject("Microsoft.XMLDOM");
        
        var formName = null ;
        if (typeof(formNameAlias) == "undefined" && formNameAlias == null) {
            formName = formNameAlias ;
        } else {
            formName = formElem.name ;
        }
        
        xmlDoc.loadXML("<" + formName + "></" + formName + ">\n");
        var root=xmlDoc.documentElement;
        
        var elems = formElem.elements ;

        for( var i = 0 ; i < elems.length ; i ++ ) {
            var newNode = xmlDoc.createElement(elems[i].name)
            newNode.appendChild(xmlDoc.createCDATASection(elems[i].value)) ;
            root.appendChild(newNode) ;
            //root.setAttribute(elems[i].name,elems[i].value) ;
        }
        
        return xmlDoc.xml ;
    }
    
    // xml(name & value 对应所为节点的属性)转换为把表单中的元素
    function xml2Form(xmlAsString,formElem){

        var node = null ;
        var xmlObj = xml2Object(xmlAsString) ;
                
        var elems = formElem.elements ;
    
        for( var i = 0 ; i < elems.length ; i ++ ) {
            var eValue = xmlObj[elems[i].name] ;
         
            if (typeof(eValue) != "undefined" 
                    && eValue != null
                    && typeof(eValue.innerText) != "undefined") {
                 eValue = eValue.innerText ;
            }
            
            if (typeof(eValue) == "undefined" || eValue == null) {
				elems[i].value = "" ;
			} else {
				elems[i].value = eValue ;
			}
            //root.setAttribute(elems[i].name,elems[i].value) ;
        }
    }
    
    // 把多个表单中的所有元素转为xml(name & value 对应所为节点的属性)
    function forms2Xml(formName){
        var forms = document.getElementsByName(formName) ;
        var retXml = "<" + formName + "_set>" ;
                        
        for( var j = 0 ; j < forms.length ; j ++) {
            retXml += form2Xml(forms[j]);
        }
        
        retXml += "</" + formName + "_set>"
        
        return retXml ;
    }
    
    // 向xml串根节点加入子xml串
    function addXmlDocChild(parentXml,childXml){

        var xmlDocParent = new ActiveXObject("Microsoft.XMLDOM");
        xmlDocParent.loadXML(parentXml);
        var parentElem=xmlDocParent.documentElement;
        
        var xmlDocChild = new ActiveXObject("Microsoft.XMLDOM");
        xmlDocChild.loadXML(childXml);
        var childElem=xmlDocChild.documentElement;
        
        parentElem.appendChild(childElem) ;

        return xmlDocParent.xml ;
    }
    
    // 移动根结点下的子结点
    function moveRootChildren(toXml,fromXml) {
        var xmlDocTo = new ActiveXObject("Microsoft.XMLDOM");
        xmlDocTo.loadXML(toXml);
        var toElem=xmlDocTo.documentElement;
        
        var xmlDocFrom = new ActiveXObject("Microsoft.XMLDOM");
        xmlDocFrom.loadXML(fromXml);
        var fromElem=xmlDocFrom.documentElement;


        for(i=0;i<fromElem.childNodes.length;i++){
            var e=fromElem.childNodes(i);   
            toElem.appendChild(e) ;
        } 

        return xmlDocTo.xml ;
    }
    